package control;

import java.awt.*;
import java.awt.event.*;
import java.io.Serializable;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.border.*;

import modelo.Expresion;
import modelo.Observador;

import org.osoa.sca.annotations.Reference;

import comunicacion.*;
import interfaz.*;

//public class Controlador {

public class Controlador extends Observador implements Runnable, Serializable {

	private InterfazBienvenida dialog;
	private InterfazEstudiante intEst;

	private String usuario;
	private String preguntaActual = "";
	private String temaActual = "";
	public ArrayList<String> listaVariablesGlobalesModelo = new ArrayList<String>();
	public ArrayList<String> listaVariablesEstudiante = new ArrayList<String>();
	public ArrayList<Expresion> listaExpresiones = new ArrayList<Expresion>();

	@Reference
	private static IPizarraEstudiante servicioPizarraEstudiante;

	public void setServicioPizarraEstudiante(IPizarraEstudiante servicioPizarra) {
		Controlador.servicioPizarraEstudiante = servicioPizarra;
	}

	//
	// @Reference
	// private IObservable servicioObservable;
	//
	// public void setServicioPizarra(IObservable servicioPizarra) {
	// Controlador.servicioObservable = servicioPizarra;
	// }
	//
	// @Reference
	// private IChat servicioChat;
	//
	// public void setServicioChat(IChat servicioChat) {
	// Controlador.servicioChat = servicioChat;
	// }

	/**
	 * Launch the application.
	 */
	// public void main(String[] args) {
	// TODO Auto-generated method stub
	public void run() {
		try {

			dialog = new InterfazBienvenida();
			dialog.setLocationRelativeTo(null);
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);

			intEst = new InterfazEstudiante();
			intEst.setVisible(false);

		} catch (Exception e) {
			e.printStackTrace();
		}

		// servicioObservable.asociar(this);

		eventos();

	}

	public void eventos() {

		dialog.getButtonIngresar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!dialog.getTextFieldUsuario().getText().isEmpty()) {

					String estudiante = dialog.getTextFieldUsuario().getText();

					// Enviar Usuario a Pizarra por SCA
					boolean confirmacion = servicioPizarraEstudiante
							.registrarEstudiante(estudiante);

					if (confirmacion) {

						usuario = estudiante;

						dialog.setVisible(false);

						intEst.setUsuario(dialog.getTextFieldUsuario()
								.getText());

						temaActual = servicioPizarraEstudiante
								.obtenerTemaActual();

						actualizar();

						intEst.setVisible(true);
					} else {
						// Mejorar?
						dialog.getTextFieldUsuario().setText(
								"Error de Autenticacion");

					}
				}

			}
		});

		intEst.getTextFieldValor().addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent evt) {
				char car = evt.getKeyChar();
				if ((car < '0' || car > '9')
						&& intEst.getTextFieldValor().getText().contains(".")) {
					evt.consume();
				} else if ((car < '0' || car > '9') && (car != '.')) {
					evt.consume();
				}
			}
		});

		intEst.getComboBoxPropias().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				// Se obtiene por SCA

				intEst.getCampoExpresiones().setText(
						intEst.getCampoExpresiones().getText()
								+ intEst.getComboBoxPropias().getSelectedItem()
								+ "");
				intEst.getCampoExpresiones().repaint();

			}
		});

		intEst.getComboBoxGlobales().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				// Se obtiene por SCA

				intEst.getCampoExpresiones().setText(
						intEst.getCampoExpresiones().getText()
								+ (intEst.getComboBoxGlobales()
										.getSelectedItem() + "").split("#")[0]);
				intEst.getCampoExpresiones().repaint();

			}
		});

		intEst.getComboBoxExpresiones().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				// Se obtiene por SCA

				intEst.getCampoExpresiones().setText(

				intEst.getComboBoxExpresiones().getSelectedItem() + "");
				intEst.getCampoExpresiones().repaint();

			}
		});

		intEst.getComboBoxPreguntas().addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub

				preguntaActual = intEst.getComboBoxPreguntas()
						.getSelectedItem() + "";

			}
		});
		intEst.getBtnGuardar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intEst.getCampoExpresiones().getText().isEmpty()) {

					String expresion = intEst.getCampoExpresiones().getText();

					anadirExpresion(expresion);

					intEst.getCampoExpresiones().setText("");

					intEst.getLblEstadoVerif().setText("No verificado");
					intEst.getEstadoEnvio().setText("No Enviado");
				}
			}
		});

		intEst.getBtnBorrarExp().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intEst.getCampoExpresiones().getText().isEmpty()) {

					eliminarExpresion(intEst.getCampoExpresiones().getText());

					intEst.getCampoExpresiones().setText("");
				}
			}
		});

		intEst.getBtnVerificar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intEst.getCampoExpresiones().getText().isEmpty()) {
					// Enviar por SCA

					String exp = intEst.getCampoExpresiones().getText();

					for (int i = 0; i < listaExpresiones.size(); i++) {
						if (listaExpresiones.get(i).getExp().equals(exp)) {

							System.out.println(listaExpresiones.get(i).getExp()
									+ "-" + listaExpresiones.get(i).getTema());
							boolean resultado = servicioPizarraEstudiante
									.verificarExpresion(listaExpresiones.get(i)
											.getExp(), listaExpresiones.get(i)
											.getListaVaribles(),
											listaExpresiones.get(i).getTema());
							System.out.println("Resultado Verificacion:"
									+ resultado);

							if (resultado) {
								System.out.println("Correctamente construida");

								intEst.getLblEstadoVerif().setText(
										listaExpresiones.get(i).getExp()
												+ " bien formada");

							}
						}
					}

					intEst.getCampoExpresiones().setText("");

				}
			}
		});

		intEst.getBtnEnviar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intEst.getCampoExpresiones().getText().isEmpty()) {
					// Enviar por SCA

					intEst.getLblEstadoVerif().setText("No verificado");

					String exp = intEst.getCampoExpresiones().getText();

					for (int i = 0; i < listaExpresiones.size(); i++) {
						if (listaExpresiones.get(i).getExp().equals(exp)) {
							boolean resultado = servicioPizarraEstudiante
									.enviarRespuesta(usuario, listaExpresiones
											.get(i).getExp(), listaExpresiones
											.get(i).getListaVaribles(),
											listaExpresiones.get(i).getTema(),
											Integer.parseInt((intEst
													.getComboBoxPreguntas()
													.getSelectedItem() + "")
													.split("#")[0]));
							System.out.println("Resultado envio: " + resultado);

							if (resultado) {

								intEst.getEstadoEnvio().setText("Enviado");

							}
						}
					}

					intEst.getCampoExpresiones().setText("");

				}
			}
		});

		intEst.getBtnChatEnviar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				// if (!intEst.getCampoChat().getText().isEmpty()) {
				// String mensajeChat = intEst.getCampoChat().getText();
				//
				// // Enviar Chat por SCA
				// if (!servicioChat.enviarChat(usuario, mensajeChat).equals(
				// null)) {
				//
				// ArrayList<String> listaChat = (ArrayList<String>)
				// servicioChat
				// .enviarChat(usuario, mensajeChat);
				//
				// for (int i = 0; i < listaChat.size(); i++) {
				//
				// intEst.getAreaChat().setText(
				// intEst.getAreaChat().getText() + "\n"
				// + listaChat.get(i));
				//
				// }
				//
				// intEst.getCampoChat().setText("");
				//
				// } else {
				// intEst.getAreaChat().setText(
				// "Error de comunicacion con Pizarra");
				// }
				//
				// }
			}
		});

		intEst.getBtnAgregar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intEst.getTextFieldNombre().getText().isEmpty()
						&& !intEst.getTextFieldValor().getText().isEmpty()) {

					String nombre = intEst.getTextFieldNombre().getText();
					String valor = intEst.getTextFieldValor().getText();

					anadirVariable(nombre, valor);
					intEst.getTextFieldNombre().setText("");
					intEst.getTextFieldValor().setText("");

				}
			}
		});

		intEst.getBtnBorrar().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {

				if (!intEst.getTextFieldNombre().getText().isEmpty()) {

					// String nombre = intEst.getTextFieldNombre().getText();

					// Enviar por SCA

					eliminarConstante(intEst.getTextFieldNombre().getText());

					intEst.getTextFieldNombre().setText("");

				}
			}
		});

	}

	public void anadirVarGlob(String nombre) {

		// Cambiar Entrada
		JLabel botonNuevo = new JLabel(nombre);
		botonNuevo.setBorder(LineBorder.createBlackLineBorder());
		botonNuevo.setVisible(true);
		botonNuevo.setEnabled(true);

		// Actualiza JComboBox
		intEst.getComboBoxGlobales().addItem(nombre);
		intEst.getComboBoxGlobales().repaint();

		if (intEst.getListaConstantesGlobales().size() == 0) {
			botonNuevo.setBounds(0, 0, 180, 20);
		} else {
			JLabel temp = intEst.getListaConstantesGlobales().get(
					intEst.getListaConstantesGlobales().size() - 1);

			botonNuevo.setBounds(0, (int) temp.getBounds().getCenterY() + 8,
					(int) temp.getBounds().getWidth(), (int) temp.getBounds()
							.getHeight());

		}

		intEst.getListaConstantesGlobales().add(botonNuevo);

		intEst.getPanelInternoConstantesGlobales().add(botonNuevo);

		intEst.getPanelInternoConstantesGlobales().setPreferredSize(
				new Dimension(0, (int) intEst
						.getPanelInternoConstantesPropias().getSize()
						.getHeight() + 30));

		intEst.getPanelInternoConstantesGlobales().repaint();

		intEst.getScrollPanelConstantesGlobales().setViewportView(
				intEst.getPanelInternoConstantesGlobales());

		intEst.getScrollPanelConstantesGlobales().repaint();

	}

	public void anadirVariable(String nombre, String valor) {

		// Cambiar Entrada
		JLabel botonNuevo = new JLabel(nombre + "#" + valor);
		botonNuevo.setBorder(LineBorder.createBlackLineBorder());
		botonNuevo.setVisible(true);
		botonNuevo.setEnabled(true);

		listaVariablesEstudiante.add(nombre + "#" + valor);

		// Actualiza JComboBox
		intEst.getComboBoxPropias().addItem(nombre);
		intEst.getComboBoxPropias().repaint();

		if (intEst.getListaConstantesPropias().size() == 0) {
			botonNuevo.setBounds(0, 0, 180, 20);
		} else {
			JLabel temp = intEst.getListaConstantesPropias().get(
					intEst.getListaConstantesPropias().size() - 1);

			botonNuevo.setBounds(0, (int) temp.getBounds().getCenterY() + 8,
					(int) temp.getBounds().getWidth(), (int) temp.getBounds()
							.getHeight());

		}

		intEst.getListaConstantesPropias().add(botonNuevo);

		intEst.getPanelInternoConstantesPropias().add(botonNuevo);

		intEst.getPanelInternoConstantesPropias().setPreferredSize(
				new Dimension(0, (int) intEst
						.getPanelInternoConstantesPropias().getSize()
						.getHeight() + 30));

		intEst.getPanelInternoConstantesPropias().repaint();

		intEst.getScrollPanelConstantesPropias().setViewportView(
				intEst.getPanelInternoConstantesPropias());

		intEst.getScrollPanelConstantesPropias().repaint();

	}

	public void eliminarConstante(String nombre) {

		for (int i = 0; i < listaVariablesEstudiante.size(); i++) {

			if (listaVariablesEstudiante.get(i).contains(nombre)) {
				listaVariablesEstudiante.remove(i);
			}

		}

		for (int i = 0; i < intEst.getListaConstantesPropias().size(); i++) {

			JLabel temp = intEst.getListaConstantesPropias().get(i);
			System.out.println(temp.getText());
			if (temp.getText().equals(nombre)) {
				intEst.getListaConstantesPropias().remove(i);
				// Reestablece Combobox
				intEst.getComboBoxPropias().removeAllItems();
				intEst.getComboBoxPropias().addItem("");

				for (int i2 = 0; i2 < intEst.getListaConstantesPropias().size(); i2++) {

					String text = intEst.getListaConstantesPropias().get(i2)
							.getText();
					System.out.println("Entra: " + text);
					intEst.getComboBoxPropias().addItem(text);

				}
				intEst.getComboBoxPropias().validate();
				intEst.getComboBoxPropias().repaint();

				System.out.println("Removio");
				intEst.getPanelInternoConstantesPropias().remove(temp);
				intEst.getPanelInternoConstantesPropias().repaint();
				i = intEst.getListaConstantesPropias().size();
				intEst.getPanelInternoConstantesPropias().setPreferredSize(
						new Dimension(0, (int) intEst
								.getPanelInternoConstantesPropias().getSize()
								.getHeight() - 30));
				intEst.getScrollPanelConstantesPropias().setViewportView(
						intEst.getPanelInternoConstantesPropias());
			}

		}

	}

	public void anadirExpresion(String expresion) {
		Expresion exp = new Expresion();

		// Al Combo
		intEst.getComboBoxExpresiones().addItem(expresion);

		ArrayList<String> listaVariablesAsociadas = new ArrayList<String>();

		for (int i = 0; i < listaVariablesEstudiante.size(); i++) {

			String varTemp = listaVariablesEstudiante.get(i);

			String identificador = varTemp.split("#")[0];

			if (expresion.contains(identificador)) {
				listaVariablesAsociadas.add(varTemp);
				System.out.println("En la lista: " + identificador);
			}

		}

		exp.setExp(expresion);
		exp.setListaVaribles(listaVariablesAsociadas);
		exp.setTema(temaActual);

		listaExpresiones.add(exp);
	}

	public void eliminarExpresion(String expresion) {

		for (int i = 0; i < listaExpresiones.size(); i++) {

			if (expresion.equals(listaExpresiones.get(i).getExp())) {

				listaExpresiones.remove(i);
				// Reestablece Combobox
				intEst.getComboBoxExpresiones().removeAllItems();
				intEst.getComboBoxExpresiones().addItem("");

				for (int i2 = 0; i2 < listaExpresiones.size(); i2++) {

					intEst.getComboBoxExpresiones().addItem(
							listaExpresiones.get(i2).getExp());

				}

			}
		}
	}

	// Donde llamarlo?
	public void pintarVariablesGlobales() {

		listaVariablesGlobalesModelo = servicioPizarraEstudiante
				.obtenerListaVariablesGlobales(temaActual);

		for (int i = 0; i < listaVariablesGlobalesModelo.size(); i++) {

			anadirVarGlob(listaVariablesGlobalesModelo.get(i));

		}

	}

	public void pintarTema() {

		temaActual = servicioPizarraEstudiante.obtenerTemaActual();

		intEst.getTituloTema().setText(temaActual);

	}

	public void pintarPregunta() {

		ArrayList<String> pregunta = servicioPizarraEstudiante
				.obtenerPreguntas(temaActual);

		for (int i = 0; i < pregunta.size(); i++) {
			intEst.getComboBoxPreguntas().addItem(pregunta.get(i));
		}

	}

	// Donde llamarlo
	public void pintarCalificacion() {

		String cal = servicioPizarraEstudiante.obtenerCalificacion(usuario,
				Integer.parseInt(preguntaActual.split("#")[0]), temaActual);

		intEst.getEstadoEnvio().setText(cal);
	}

	@Override
	public void actualizar() {

		System.out.println("Entra a Actualizar");

		pintarTema();
		pintarPregunta();
		pintarVariablesGlobales();

		/*
		 * 
		 * listaVariablesGlobalesModelo = servicioPizarraEstudiante
		 * .obtenerListaVariablesGlobales(temaActual);
		 * 
		 * listaVariablesEstudiante = servicioPizarraEstudiante
		 * .obtenerListaVariablesEstudiante(usuario,
		 * Integer.parseInt(preguntaActual.split("#")[0]));
		 */
	}

}
